home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / pyshared / PIL / BdfFontFile.py < prev    next >
Text File  |  2006-12-03  |  3KB  |  134 lines

  1. #
  2. # The Python Imaging Library
  3. # $Id: BdfFontFile.py 2134 2004-10-06 08:55:20Z fredrik $
  4. #
  5. # bitmap distribution font (bdf) file parser
  6. #
  7. # history:
  8. # 1996-05-16 fl   created (as bdf2pil)
  9. # 1997-08-25 fl   converted to FontFile driver
  10. # 2001-05-25 fl   removed bogus __init__ call
  11. # 2002-11-20 fl   robustification (from Kevin Cazabon, Dmitry Vasiliev)
  12. # 2003-04-22 fl   more robustification (from Graham Dumpleton)
  13. #
  14. # Copyright (c) 1997-2003 by Secret Labs AB.
  15. # Copyright (c) 1997-2003 by Fredrik Lundh.
  16. #
  17. # See the README file for information on usage and redistribution.
  18. #
  19.  
  20. import Image
  21. import FontFile
  22.  
  23. import string
  24.  
  25. # --------------------------------------------------------------------
  26. # parse X Bitmap Distribution Format (BDF)
  27. # --------------------------------------------------------------------
  28.  
  29. bdf_slant = {
  30.    "R": "Roman",
  31.    "I": "Italic",
  32.    "O": "Oblique",
  33.    "RI": "Reverse Italic",
  34.    "RO": "Reverse Oblique",
  35.    "OT": "Other"
  36. }
  37.  
  38. bdf_spacing = {
  39.     "P": "Proportional",
  40.     "M": "Monospaced",
  41.     "C": "Cell"
  42. }
  43.  
  44. def bdf_char(f):
  45.  
  46.     # skip to STARTCHAR
  47.     while 1:
  48.         s = f.readline()
  49.         if not s:
  50.             return None
  51.         if s[:9] == "STARTCHAR":
  52.             break
  53.     id = string.strip(s[9:])
  54.  
  55.     # load symbol properties
  56.     props = {}
  57.     while 1:
  58.         s = f.readline()
  59.         if not s or s[:6] == "BITMAP":
  60.             break
  61.         i = string.find(s, " ")
  62.         props[s[:i]] = s[i+1:-1]
  63.  
  64.     # load bitmap
  65.     bitmap = []
  66.     while 1:
  67.         s = f.readline()
  68.         if not s or s[:7] == "ENDCHAR":
  69.             break
  70.         bitmap.append(s[:-1])
  71.     bitmap = string.join(bitmap, "")
  72.  
  73.     [x, y, l, d] = map(int, string.split(props["BBX"]))
  74.     [dx, dy] = map(int, string.split(props["DWIDTH"]))
  75.  
  76.     bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y)
  77.  
  78.     try:
  79.         im = Image.fromstring("1", (x, y), bitmap, "hex", "1")
  80.     except ValueError:
  81.         # deal with zero-width characters
  82.         im = Image.new("1", (x, y))
  83.  
  84.     return id, int(props["ENCODING"]), bbox, im
  85.  
  86. ##
  87. # Font file plugin for the X11 BDF format.
  88.  
  89. class BdfFontFile(FontFile.FontFile):
  90.  
  91.     def __init__(self, fp):
  92.  
  93.         FontFile.FontFile.__init__(self)
  94.  
  95.         s = fp.readline()
  96.         if s[:13] != "STARTFONT 2.1":
  97.             raise SyntaxError, "not a valid BDF file"
  98.  
  99.         props = {}
  100.         comments = []
  101.  
  102.         while 1:
  103.             s = fp.readline()
  104.             if not s or s[:13] == "ENDPROPERTIES":
  105.                 break
  106.             i = string.find(s, " ")
  107.             props[s[:i]] = s[i+1:-1]
  108.             if s[:i] in ["COMMENT", "COPYRIGHT"]:
  109.                 if string.find(s, "LogicalFontDescription") < 0:
  110.                     comments.append(s[i+1:-1])
  111.  
  112.         font = string.split(props["FONT"], "-")
  113.  
  114.         font[4] = bdf_slant[string.upper(font[4])]
  115.         font[11] = bdf_spacing[string.upper(font[11])]
  116.  
  117.         ascent = int(props["FONT_ASCENT"])
  118.         descent = int(props["FONT_DESCENT"])
  119.  
  120.         fontname = string.join(font[1:], ";")
  121.  
  122.         # print "#", fontname
  123.         # for i in comments:
  124.         #       print "#", i
  125.  
  126.         font = []
  127.         while 1:
  128.             c = bdf_char(fp)
  129.             if not c:
  130.                 break
  131.             id, ch, (xy, dst, src), im = c
  132.             if ch >= 0 and ch < len(self.glyph):
  133.                 self.glyph[ch] = xy, dst, src, im
  134.